#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#include "TParser.h"

#include "ListaSimple.h"

#define CLAVE "user_screen_name"



typedef struct user {
        char* name;
        int count;
    } user;


int cmptousers(void* usr1, void* usr2)
{
    user* aux1 =(user*)usr1;
    user* aux2 = (user*)usr2;
    return(strcmp(aux1->name, aux2->name));
}

/*
pre: la cola ha sido creada
post: se procesa la cola, se guarda e un array el nombre de usuario y la cantidad de tweet en la que aparece, luego
se recorre esa array y se imprime por pantalla
*/

int ProcesarReporte(TCola* cola)
{
    int i;
    user* u;
    V_Array array;
    funccmp cmp = cmptousers;
    VA_create(&array, sizeof(user));

    /*Recorro la cola*/
    while(!C_Vacia(*cola))
    {
        TDiccionario d;

        C_Sacar(cola, (void*)(&d));
        if(&d != NULL)
        {
            int len;
            /*Si len es mayor a cero quiere decir el valor de la clave no esta vacio*/
            len = TDiccionario_sizeDato(&d, CLAVE );
            if(len)
            {
                u = (user*)malloc(sizeof(user));
                if(!u)
                    return 1;
                u->name = (char*)malloc(len + 1);
                if(u->name)
                {
                    TDiccionario_obtener(&d, CLAVE, u->name);
                    /*verifico si existe el user*/
                    if(array.a_count > 0 && (i = VA_binary_search(&array,cmp,0, array.a_count -1, u))>= 0)
                    {
                        /*si existe hago un update*/
                        VA_get_i(array,i,(void*) u);
                        u->count++;
                        VA_set(&array, i, (void*)u);

                    }else /*sino inserto y ordeno*/
                    {
                        u->count = 1;
                        VA_add(&array, (void*)u);
                        VA_qsort(&array, cmp,0,array.a_count -1 );

                    }
                    free(u);
                }
            }
        }
    }
    /*Recorro el array e imprimo por pantalla los usuarios que escribieron mas de 2 tweet*/
    for(i = 0 ; i < array.a_count; i++)
    {
       user uu ;

        VA_get_i(array, i, &uu);
        if(uu.count >=2)
            printf("%s  :  %d \n", uu.name, uu.count);
    }
    VA_destroy(&array);
    return 0;
}


int main(int argu, char* argv[])
{


    TParser p;
    TLexico aLexico;
    TSintactico aSintactico;
    TConstructor* tc = TConstructor_Crear();

    TCola cola;
    C_Crear(&cola, (int)sizeof(TDiccionario));
    Tconstructor_setCola(tc, &cola);

    TParser_Crear(&p);
    TLexico_Crear(&aLexico);
	TSintactico_Crear(&aSintactico);
	Tsintactico_setCallback(&aSintactico, 0, tc , (TCallback) TConstructor_eventoOcurrido );


	TLexico_setAnalizadorSintactico(&aLexico,&aSintactico);
	TParser_setAnalizadorLexico(&p,&aLexico);


    FILE* file = fopen(argv[1], "r");



    printf("\n\n");

    if(file == NULL)
    {
    	printf("Archivo no encontrado");
        return 1;
    }
      while (feof(file) == 0 )
     {
        char c = fgetc(file);


        TParser_PushChar(&p, c);
     }

     fclose(file);


    TParser_terminarFlujo(&p);

    printf("\n\n");


    ProcesarReporte(&cola);

    TConstructor_Destruir(tc);
    if(!C_Vacia(cola))
        C_Vaciar(&cola);


    TSintactico_Destruir(&aSintactico);
    TLexico_Destruir(&aLexico);

    return 0;
}
